WOLF core
WOLF: A Modular Estimation Framework for Robotics
XXXXXXXXXXXXXXXXXXXXXXXXvoid(0)" frameborder="0" name="MSearchResults" id="MSearchResults">
feature_base.h
Go to the documentation of this file.
1// WOLF - Copyright (C) 2020-2026
2// Institut de Robòtica i Informàtica Industrial, CSIC-UPC.
3// Authors: Joan Solà Ortega (jsola@iri.upc.edu) and
4// Joan Vallvé Navarro (jvallve@iri.upc.edu)
5// All rights reserved.
6//
7// This file is part of WOLF: http://www.iri.upc.edu/wolf
8// WOLF is free software: you can redistribute it and/or modify
9// it under the terms of the GNU General Public License version 3
10// as published by the Free Software Foundation.
11//
12// This program is distributed in the hope that it will be useful,
13// but WITHOUT ANY WARRANTY; without even the implied warranty of
14// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15// GNU General Public License for more details.
16//
17// You should have received a copy of the GNU General Public License
18// along with this program. If not, see <http://www.gnu.org/licenses/>.
19#pragma once
20
21// Forward declarations for node templates
22namespace wolf
23{
24class CaptureBase;
25class FactorBase;
26} // namespace wolf
27
28// Wolf includes
29#include "core/common/wolf.h"
31
32// std includes
33
34namespace wolf
35{
36// class FeatureBase
37class FeatureBase : public NodeBase, public std::enable_shared_from_this<FeatureBase>
38{
39 friend CaptureBase;
40 friend SensorBase;
41 friend FactorBase;
42
43 private:
44 CaptureBaseWPtr capture_ptr_;
45 FactorBasePtrList factor_list_;
46
47 static unsigned int feature_id_count_;
48
49 protected:
50 unsigned int feature_id_;
51 unsigned int track_id_; // ID of the feature track
52 unsigned int landmark_id_; // ID of the landmark
53 Eigen::VectorXd measurement_;
54 Eigen::MatrixXd measurement_covariance_;
56 Eigen::VectorXd expectation_;
57
58 public:
59 typedef enum
60 {
65
71 FeatureBase(const std::string& _type,
72 const Eigen::VectorXd& _measurement,
73 const Eigen::MatrixXd& _meas_uncertainty,
74 UncertaintyType _uncertainty_type = UNCERTAINTY_IS_COVARIANCE);
75
76 ~FeatureBase() override = default;
77 virtual void remove(bool viral_remove_parent_without_children = false);
78 bool hasChildren() const override
79 {
80 return not factor_list_.empty();
81 };
82
83 // properties
84 unsigned int id() const;
85 unsigned int trackId() const
86 {
87 return track_id_;
88 }
89 void setTrackId(unsigned int _tr_id)
90 {
91 track_id_ = _tr_id;
92 }
93 unsigned int landmarkId() const
94 {
95 return landmark_id_;
96 }
97 void setLandmarkId(unsigned int _lmk_id)
98 {
99 landmark_id_ = _lmk_id;
100 }
101
102 // values
103 /* \brief Returns _ii component of measurement vector
104 *
105 * WARNING: To be fast, it does not check that index _ii is smaller than dimension.
106 */
107 double getMeasurement(unsigned int _ii) const;
108 const Eigen::VectorXd& getMeasurement() const;
109
110 private:
111 /* \brief Set the measurement and its noise
112 *
113 * WARNING: To be used once in the constructor only.
114 */
115 void setMeasurement(const Eigen::VectorXd& _meas);
116 void setMeasurementCovariance(const Eigen::MatrixXd& _meas_cov);
117 void setMeasurementInformation(const Eigen::MatrixXd& _meas_info);
118
119 public:
120 const Eigen::MatrixXd& getMeasurementCovariance() const;
121 Eigen::MatrixXd getMeasurementInformation() const;
122 const Eigen::MatrixXd& getMeasurementSquareRootInformationUpper() const;
123
124 const Eigen::VectorXd& getExpectation() const;
125 void setExpectation(const Eigen::VectorXd& expectation);
126
127 // wolf tree access
128 FrameBaseConstPtr getFrame() const;
129 FrameBasePtr getFrame();
130
131 CaptureBaseConstPtr getCapture() const;
132 CaptureBasePtr getCapture();
133
134 FactorBaseConstPtrList getFactorList() const;
135 FactorBasePtrList getFactorList();
136 void getFactorList(FactorBaseConstPtrList& _fac_list) const;
137 void getFactorList(FactorBasePtrList& _fac_list);
138 bool hasFactor(FactorBaseConstPtr _fac) const;
139
140 void link(CaptureBasePtr cap_ptr);
141 template <typename classType, typename... T>
142 static std::shared_ptr<classType> emplace(CaptureBasePtr _cpt_ptr, T&&... all);
143
144 virtual void printHeader(int depth, //
145 bool factored_by, //
146 bool metric, //
147 bool state_blocks,
148 std::ostream& stream,
149 std::string _tabs = "") const;
150 void print(int depth, //
151 bool factored_by, //
152 bool metric, //
153 bool state_blocks,
154 std::ostream& stream = std::cout,
155 std::string _tabs = "") const;
156
157 virtual CheckLog localCheck(bool _verbose, std::ostream& _stream, std::string _tabs = "") const;
158 bool check(CheckLog& _log, bool _verbose, std::ostream& _stream, std::string _tabs = "") const;
159
160 private:
161 void setCapture(CaptureBasePtr _cap_ptr)
162 {
163 capture_ptr_ = _cap_ptr;
164 }
165 FactorBasePtr addFactor(FactorBasePtr _co_ptr);
166 void removeFactor(FactorBasePtr _co_ptr);
167};
168
169} // namespace wolf
170
171// IMPLEMENTATION
172
174
175namespace wolf
176{
177template <typename classType, typename... T>
178std::shared_ptr<classType> FeatureBase::emplace(CaptureBasePtr _cpt_ptr, T&&... all)
179{
180 std::shared_ptr<classType> ftr = std::make_shared<classType>(std::forward<T>(all)...);
181 ftr->link(_cpt_ptr);
182 return ftr;
183}
184
185inline FactorBaseConstPtrList FeatureBase::getFactorList() const
186{
187 FactorBaseConstPtrList list_const;
188 for (auto&& obj_ptr : factor_list_) list_const.push_back(obj_ptr);
189 return list_const;
190}
191
192inline FactorBasePtrList FeatureBase::getFactorList()
193{
194 return factor_list_;
195}
196
197inline unsigned int FeatureBase::id() const
198{
199 return feature_id_;
200}
201
202inline CaptureBaseConstPtr FeatureBase::getCapture() const
203{
204 return capture_ptr_.lock();
205}
206
207inline CaptureBasePtr FeatureBase::getCapture()
208{
209 return capture_ptr_.lock();
210}
211
212inline double FeatureBase::getMeasurement(unsigned int _ii) const
213{
214 return measurement_(_ii);
215}
216
217inline const Eigen::VectorXd& FeatureBase::getMeasurement() const
218{
219 return measurement_;
220}
221
222inline const Eigen::MatrixXd& FeatureBase::getMeasurementCovariance() const
223{
225}
226
227inline Eigen::MatrixXd FeatureBase::getMeasurementInformation() const
228{
230}
231
232inline const Eigen::MatrixXd& FeatureBase::getMeasurementSquareRootInformationUpper() const
233{
235}
236
237inline const Eigen::VectorXd& FeatureBase::getExpectation() const
238{
239 return expectation_;
240}
241
242inline void FeatureBase::setExpectation(const Eigen::VectorXd& expectation)
243{
244 expectation_ = expectation;
245}
246
247} // namespace wolf
Definition: capture_base.h:39
Definition: check_log.h:28
Definition: factor_base.h:72
Definition: feature_base.h:38
bool hasFactor(FactorBaseConstPtr _fac) const
Definition: feature_base.cpp:97
unsigned int feature_id_
Definition: feature_base.h:50
FeatureBase(const std::string &_type, const Eigen::VectorXd &_measurement, const Eigen::MatrixXd &_meas_uncertainty, UncertaintyType _uncertainty_type=UNCERTAINTY_IS_COVARIANCE)
Constructor from capture pointer and measure.
Definition: feature_base.cpp:28
CaptureBaseConstPtr getCapture() const
Definition: feature_base.h:202
Eigen::VectorXd expectation_
expectation
Definition: feature_base.h:56
Eigen::MatrixXd measurement_covariance_
the measurement covariance matrix
Definition: feature_base.h:54
Eigen::MatrixXd measurement_sqrt_information_upper_
the squared root information matrix
Definition: feature_base.h:55
Eigen::MatrixXd getMeasurementInformation() const
Definition: feature_base.h:227
void link(CaptureBasePtr cap_ptr)
Definition: feature_base.cpp:152
const Eigen::MatrixXd & getMeasurementSquareRootInformationUpper() const
Definition: feature_base.h:232
void setLandmarkId(unsigned int _lmk_id)
Definition: feature_base.h:97
static std::shared_ptr< classType > emplace(CaptureBasePtr _cpt_ptr, T &&... all)
Definition: feature_base.h:178
bool hasChildren() const override
Definition: feature_base.h:78
~FeatureBase() override=default
UncertaintyType
Definition: feature_base.h:60
@ UNCERTAINTY_IS_STDDEV
Definition: feature_base.h:63
@ UNCERTAINTY_IS_INFO
Definition: feature_base.h:62
@ UNCERTAINTY_IS_COVARIANCE
Definition: feature_base.h:61
const Eigen::VectorXd & getMeasurement() const
Definition: feature_base.h:217
unsigned int track_id_
Definition: feature_base.h:51
const Eigen::VectorXd & getExpectation() const
Definition: feature_base.h:237
FactorBaseConstPtrList getFactorList() const
Definition: feature_base.h:185
Eigen::VectorXd measurement_
the measurement vector
Definition: feature_base.h:53
virtual void printHeader(int depth, bool factored_by, bool metric, bool state_blocks, std::ostream &stream, std::string _tabs="") const
Definition: feature_base.cpp:168
void setExpectation(const Eigen::VectorXd &expectation)
Definition: feature_base.h:242
unsigned int landmark_id_
Definition: feature_base.h:52
FrameBaseConstPtr getFrame() const
Definition: feature_base.cpp:112
virtual CheckLog localCheck(bool _verbose, std::ostream &_stream, std::string _tabs="") const
Definition: feature_base.cpp:195
void print(int depth, bool factored_by, bool metric, bool state_blocks, std::ostream &stream=std::cout, std::string _tabs="") const
Definition: feature_base.cpp:182
unsigned int id() const
Definition: feature_base.h:197
void setTrackId(unsigned int _tr_id)
Definition: feature_base.h:89
unsigned int trackId() const
Definition: feature_base.h:85
unsigned int landmarkId() const
Definition: feature_base.h:93
bool check(CheckLog &_log, bool _verbose, std::ostream &_stream, std::string _tabs="") const
Definition: feature_base.cpp:233
const Eigen::MatrixXd & getMeasurementCovariance() const
Definition: feature_base.h:222
virtual void remove(bool viral_remove_parent_without_children=false)
Definition: feature_base.cpp:56
Base class for Nodes.
Definition: node_base.h:74
Definition: sensor_base.h:124
Definition: capture_base.h:23